import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { supabase, handleSupabaseError, TABLES } from '@/lib/supabase'

export const useUserStore = defineStore('user', () => {
  // 状态
  const user = ref(null)
  const loading = ref(false)

  // 计算属性
  const isLoggedIn = computed(() => !!user.value)
  const userInfo = computed(() => user.value)

  // 动作
  const login = async (credentials) => {
    loading.value = true
    console.log('🔐 开始登录:', credentials.email)

    try {
      const { data, error } = await supabase.auth.signInWithPassword({
        email: credentials.email,
        password: credentials.password,
      })

      if (error) {
        console.error('❌ Supabase Auth 登录失败:', error)
        return { success: false, message: handleSupabaseError(error, '登录失败') }
      }

      console.log('✅ Supabase Auth 登录成功:', data.user?.id)

      if (data.user) {
        // 获取用户详细信息
        console.log('👤 开始获取用户档案...')
        const userProfile = await getUserProfile(data.user.id)

        if (userProfile) {
          console.log('✅ 使用用户档案:', userProfile)
          user.value = userProfile
          return { success: true }
        } else {
          // 如果用户档案不存在，使用 auth 用户信息
          console.warn('⚠️ 用户档案不存在，使用 auth 用户信息')
          user.value = {
            id: data.user.id,
            username: data.user.user_metadata?.username || 'user_' + data.user.id.substring(0, 8),
            name: data.user.user_metadata?.name || '用户',
            email: data.user.email,
            phone: data.user.user_metadata?.phone || '',
          }
          console.log('✅ 使用 auth 用户信息:', user.value)
          return { success: true }
        }
      }

      console.error('❌ 没有用户数据')
      return { success: false, message: '登录失败' }
    } catch (error) {
      console.error('❌ 登录异常:', error)
      return { success: false, message: handleSupabaseError(error, '登录失败') }
    } finally {
      loading.value = false
      console.log('🏁 登录流程结束')
    }
  }

  const register = async (userData) => {
    loading.value = true
    try {
      // 1. 使用 Supabase Auth 注册用户
      const { data: authData, error: authError } = await supabase.auth.signUp({
        email: userData.email,
        password: userData.password,
        options: {
          data: {
            username: userData.username,
            name: userData.name,
            phone: userData.phone,
          },
        },
      })

      if (authError) {
        return { success: false, message: handleSupabaseError(authError, '注册失败') }
      }

      if (authData.user) {
        // 2. 创建用户档案
        const { error: profileError } = await supabase.from(TABLES.USERS).insert([
          {
            id: authData.user.id,
            username: userData.username,
            name: userData.name,
            email: userData.email,
            phone: userData.phone,
          },
        ])

        if (profileError) {
          console.error('创建用户档案失败:', profileError)
          return { success: false, message: '用户档案创建失败' }
        }

        return { success: true, message: '注册成功，请检查邮箱验证' }
      }

      return { success: false, message: '注册失败' }
    } catch (error) {
      return { success: false, message: handleSupabaseError(error, '注册失败') }
    } finally {
      loading.value = false
    }
  }

  const logout = async () => {
    try {
      const { error } = await supabase.auth.signOut()
      if (error) {
        console.error('退出登录失败:', error)
      }
    } catch (error) {
      console.error('退出登录失败:', error)
    } finally {
      user.value = null
    }
  }

  const getUserProfile = async (userId) => {
    try {
      console.log('🔍 获取用户档案:', userId)

      // 添加超时处理
      const timeoutPromise = new Promise((_, reject) =>
        setTimeout(() => reject(new Error('获取用户档案超时')), 5000),
      )

      const profilePromise = supabase.from(TABLES.USERS).select('*').eq('id', userId).single()

      const { data, error } = await Promise.race([profilePromise, timeoutPromise])

      if (error) {
        console.error('获取用户档案失败:', error)
        return null
      }

      console.log('✅ 用户档案获取成功:', data)
      return data
    } catch (error) {
      console.error('获取用户档案失败:', error)
      return null
    }
  }

  const updateProfile = async (profileData) => {
    if (!user.value) return { success: false, message: '用户未登录' }

    loading.value = true
    try {
      const { error } = await supabase
        .from(TABLES.USERS)
        .update({
          name: profileData.name,
          email: profileData.email,
          phone: profileData.phone,
          updated_at: new Date().toISOString(),
        })
        .eq('id', user.value.id)

      if (error) {
        return { success: false, message: handleSupabaseError(error, '更新失败') }
      }

      // 更新本地用户信息
      user.value = {
        ...user.value,
        name: profileData.name,
        email: profileData.email,
        phone: profileData.phone,
      }

      return { success: true, message: '更新成功' }
    } catch (error) {
      return { success: false, message: handleSupabaseError(error, '更新失败') }
    } finally {
      loading.value = false
    }
  }

  const loadUserFromStorage = async () => {
    try {
      const {
        data: { session },
      } = await supabase.auth.getSession()

      if (session?.user) {
        const userProfile = await getUserProfile(session.user.id)
        if (userProfile) {
          user.value = userProfile
        } else {
          // 如果用户档案不存在，使用 auth 用户信息
          console.warn('用户档案不存在，使用 auth 用户信息')
          user.value = {
            id: session.user.id,
            username:
              session.user.user_metadata?.username || 'user_' + session.user.id.substring(0, 8),
            name: session.user.user_metadata?.name || '用户',
            email: session.user.email,
            phone: session.user.user_metadata?.phone || '',
          }
        }
      } else {
        // 没有会话，清除用户状态
        user.value = null
      }
    } catch (error) {
      console.error('加载用户信息失败:', error)
      user.value = null
    }
  }

  // 监听认证状态变化
  const initAuthListener = () => {
    supabase.auth.onAuthStateChange(async (event, session) => {
      if (event === 'SIGNED_IN' && session?.user) {
        const userProfile = await getUserProfile(session.user.id)
        if (userProfile) {
          user.value = userProfile
        } else {
          // 如果用户档案不存在，使用 auth 用户信息
          console.warn('用户档案不存在，使用 auth 用户信息')
          user.value = {
            id: session.user.id,
            username:
              session.user.user_metadata?.username || 'user_' + session.user.id.substring(0, 8),
            name: session.user.user_metadata?.name || '用户',
            email: session.user.email,
            phone: session.user.user_metadata?.phone || '',
          }
        }
      } else if (event === 'SIGNED_OUT') {
        user.value = null
      }
    })
  }

  return {
    user,
    loading,
    isLoggedIn,
    userInfo,
    login,
    register,
    logout,
    updateProfile,
    loadUserFromStorage,
    initAuthListener,
  }
})
